//
// Created by Administrator on 5/18/2024.
//

#ifndef NRF24L01_CONFIG_H
#define NRF24L01_CONFIG_H
#include "main.h"

// nRF24L01寄存器地址
#define NRF_REG_CONFIG      0x00  // 配置寄存器
#define NRF_REG_EN_AA       0x01  // 使能自动应答寄存器
#define NRF_REG_EN_RXADDR   0x02  // 使能数据通道寄存器
#define NRF_REG_SETUP_AW    0x03  // 设置地址宽度寄存器
#define NRF_REG_SETUP_RETR  0x04  // 设置自动重发寄存器
#define NRF_REG_RF_CH       0x05  // 设置RF频道寄存器
#define NRF_REG_RF_SETUP    0x06  // RF设置寄存器
#define NRF_REG_STATUS      0x07  // 状态寄存器
#define NRF_REG_OBSERVE_TX  0x08  // 发送监测寄存器
#define NRF_REG_RPD         0x09  // 接收功率检测寄存器
#define NRF_REG_RX_ADDR_P0  0x0A  // 数据通道0接收地址寄存器
#define NRF_REG_RX_ADDR_P1  0x0B  // 数据通道1接收地址寄存器
#define NRF_REG_RX_ADDR_P2  0x0C  // 数据通道2接收地址寄存器
#define NRF_REG_RX_ADDR_P3  0x0D  // 数据通道3接收地址寄存器
#define NRF_REG_RX_ADDR_P4  0x0E  // 数据通道4接收地址寄存器
#define NRF_REG_RX_ADDR_P5  0x0F  // 数据通道5接收地址寄存器
#define NRF_REG_TX_ADDR     0x10  // 发送地址寄存器
#define NRF_REG_RX_PW_P0    0x11  // 数据通道0接收数据宽度寄存器
#define NRF_REG_RX_PW_P1    0x12  // 数据通道1接收数据宽度寄存器
#define NRF_REG_RX_PW_P2    0x13  // 数据通道2接收数据宽度寄存器
#define NRF_REG_RX_PW_P3    0x14  // 数据通道3接收数据宽度寄存器
#define NRF_REG_RX_PW_P4    0x15  // 数据通道4接收数据宽度寄存器
#define NRF_REG_RX_PW_P5    0x16  // 数据通道5接收数据宽度寄存器
#define NRF_REG_FIFO_STATUS 0x17  // FIFO状态寄存器
#define NRF_REG_DYNPD       0x1C  // 动态数据长度设置寄存器
#define NRF_REG_FEATURE     0x1D  // 特性寄存器

// nRF24L01命令字
#define NRF_CMD_R_REGISTER    0x00  // 读寄存器命令
#define NRF_CMD_W_REGISTER    0x20  // 写寄存器命令
#define NRF_CMD_REGISTER_MASK 0x1F  // 寄存器地址掩码
#define NRF_CMD_R_RX_PAYLOAD  0x61  // 读取接收数据命令
#define NRF_CMD_W_TX_PAYLOAD  0xA0  // 写入发送数据命令
#define NRF_CMD_FLUSH_TX      0xE1  // 清空发送FIFO命令
#define NRF_CMD_FLUSH_RX      0xE2  // 清空接收FIFO命令
#define NRF_CMD_REUSE_TX_PL   0xE3  // 重用发送数据命令
#define NRF_CMD_ACTIVATE      0x50  // 激活命令
#define NRF_CMD_R_RX_PL_WID   0x60  // 读取接收数据宽度命令
#define NRF_CMD_W_ACK_PAYLOAD 0xA8  // 写入应答数据命令
#define NRF_CMD_W_TX_PAYLOAD_NOACK 0xB0  // 写入发送数据不等待应答命令
#define NRF_CMD_NOP           0xFF  // 无操作命令，可用于读取状态寄存器

/* 定义通信引脚 */
#define NRF_IRQ_PORT   GPIOB
#define NRF_CE_PORT    GPIOA
#define NRF_MISO_PORT  GPIOA
#define NRF_MOSI_PORT  GPIOA
#define NRF_SCK_PORT   GPIOA
#define NRF_CSN_PORT   GPIOB

#define NRF_IRQ_PIN    GPIO_PIN_6
#define NRF_CE_PIN     GPIO_PIN_15
#define NRF_MISO_PIN   GPIO_PIN_6
#define NRF_MOSI_PIN   GPIO_PIN_7
#define NRF_SCK_PIN    GPIO_PIN_5
#define NRF_CSN_PIN    GPIO_PIN_0

#define __NRF24L01_CE_SET()             do{HAL_GPIO_WritePin(NRF_CE_PORT, NRF_CE_PIN, GPIO_PIN_SET);}while(0)
#define __NRF24L01_CE_RESET()           do{HAL_GPIO_WritePin(NRF_CE_PORT, NRF_CE_PIN, GPIO_PIN_RESET);}while(0)
#define __NRF24L01_MOSI_SET()           do{HAL_GPIO_WritePin(NRF_MOSI_PORT, NRF_MOSI_PIN, GPIO_PIN_SET);}while(0)
#define __NRF24L01_MOSI_RESET()         do{HAL_GPIO_WritePin(NRF_MOSI_PORT, NRF_MOSI_PIN, GPIO_PIN_RESET);}while(0)
#define __NRF24L01_SCK_SET()            do{HAL_GPIO_WritePin(NRF_SCK_PORT, NRF_SCK_PIN, GPIO_PIN_SET);}while(0)
#define __NRF24L01_SCK_RESET()          do{HAL_GPIO_WritePin(NRF_SCK_PORT, NRF_SCK_PIN, GPIO_PIN_RESET);}while(0)
#define __NRF24L01_CSN_SET()            do{HAL_GPIO_WritePin(NRF_CSN_PORT, NRF_CSN_PIN, GPIO_PIN_SET);}while(0)
#define __NRF24L01_CSN_RESET()          do{HAL_GPIO_WritePin(NRF_CSN_PORT, NRF_CSN_PIN, GPIO_PIN_RESET);}while(0)

#define __IS_NRF24L01_MISO_SET()        HAL_GPIO_ReadPin(NRF_MISO_PORT, NRF_MISO_PIN)
#define __IS_NRF24L01_IRQ_SET()         HAL_GPIO_ReadPin(NRF_IRQ_PORT, NRF_IRQ_PIN)



#endif //NRF24L01_CONFIG_H
